perm filename HOD.MAC[1,3] blob sn#054350 filedate 1973-07-20 generic text, type T, neo UTF8
TITLE HOD HEX-OCTAL-DECIMAL CONVERTER
SUBTTL   KLOSSNER/A   18-JUL-73
	VER=600101,,1		;VERSION NUMBER

IFNDEF PURE,<PURE==0>		;ON FOR REENTRANT CODE

;ACS
	PC=	11		;PC FOR GETCHR SUBR
	IB=	12		;INPUT BASE
	OB=	13		;OUTPUT BASE
	X=	14		;INDEX REGISTER
	W=	15		;AC TO ASSEMBLE NUMBER
	S=	16		;SYMBOL WE'RE INPUTTING
	P=	17		;PDL AC

	LOC	137		;STORE VERSION NUMBER
	EXP	VER
	RELOC
PAGE
SUBTTL START AND REQUEST BASES
IFG PURE,<TWOSEG		;MAKE IT REENTRANT
	  RELOC 400000>
HOD::	JFCL			;IN CASE OF CCL ENTRY
	RESET			;OF COURSE
	OUTSTR	[ASCIZ	!
HEX-OCTAL-DECIMAL CONVERTER.  NEED HELP?  !]
	JSP	PC,GETCHR	;SEE IF THE CHOADE IS HELPLESS
	CAIN	S,"Y"		;YES?
	OUTSTR	HELP		;YES, HELP HIM OUT
ASK:	CLRBFI			;CLEAR TYPEAHEAD
OUTSTR	[ASCIZ	!
FROM !]				;REQUEST INPUT BASE
	SETZ	X,		;ZERO BASE REGISTER
	JRST	BIN		;GET BASE
H:	MOVEI	IB,↑D16		;SIGNIFY HEX INPUT
	JRST	O+1
D:	SKIPA	IB,[TEN: ↑D10]	;DECIMAL...
O:	MOVEI	IB,10		;...OR OCTAL
	OUTSTR	[ASCIZ	! TO !]	;GET OUTPUT BASE
	MOVEI	X,H2-H		;NEW INDEX
	JRST	BIN		;GET OUTPUT BASE
H2:	MOVEI	OB,↑D16		;INDICATE HEX OUTPUT
	JRST	O2+1
D2:	SKIPA	OB,TEN
O2:	MOVEI	OB,10
PAGE
SUBTTL GET THE NUMBER
	OUTSTR	[ASCIZ	!
#!]				;REQUEST NUMBER
	SETZ	W,		;ZERO RECEIVING WORD
	JFCL	17,.+1		;AND ALL FLAGS
LP:	JSP	PC,GETCHR	;GET DIGIT
	CAIN	S,"="		;PUT IT NOW?
	JRST	EQUALS		;YES
	CAIGE	S,"0"		;LEGAL DIGIT?
	JRST	ACHK		;NO, GO CHECK ALPHABETIC DIGITS
	CAILE	S,"9"
	JRST	ACHK
	MOVEI	S,-"0"(S)	;CONVERT
	JRST	PUT		;AND GO PUT IT IN
ACHK:	CAIGE	S,"A"		;LEGAL HEX?
	JRST	BAD
	CAILE	S,"F"
	JRST	BAD
	MOVEI	S,-"A"+↑D10(S)	;CONVERT
	JRST	PUT		;AND ADD IT IN
BAD:	OUTSTR	[ASCIZ	!
? BAD DIGIT
!]
	JRST	ASK		;BACK TO TRY AGAIN
PUT:	CAIL	S,(IB)		;OK DIGIT FOR THIS BASE?
	JRST	BAD		;NO
	IMULI	W,(IB)		;YES, MAKE ROOM FOR IT
	ADDI	W,(S)		;AND ADD IT IN
	JOV	.+2		;OVERFLOW?
	JRST	LP		;NO, GET ANOTHER
	OUTSTR	[ASCIZ	!
? TOO BIG
!]				;INDICATE OVERFLOW
	JRST	ASK		;TRY AGAIN
PAGE
SUBTTL OUTPUT THE NUMBER
EQUALS:	MOVE	P,[IOWD ↑D14,PDL];SET UP PDL POINTER
	PUSH	P,[0]		;END OF NUMBER INDICATOR
OIT:	IDIVI	W,(OB)		;GET A DIGIT
	MOVEI	S,"0"(S)	;CONVERT TO ASCII
	CAILE	S,"9"		;A-F?
	MOVEI	S,"A"-"9"-1(S)	;YES, ADD MORE
	PUSH	P,S		;PUSH IT
	JUMPN	W,OIT		;DO MORE DIGITS IF ANY
AO:	POP	P,S		;GET A DIGIT
	JUMPE	S,ASK		;DONE IF ZERO
	OUTCHR	S		;OUT IT
	JRST	AO		;BACK FOR MORE
PAGE
SUBTTL SUBROUTINES TO GET A BASE AND GET A CHARACTER IN UC
BIN:	JSP	PC,GETCHR	;GET THE LETTER
	CAIN	S,"H"		;HEX?
	JRST	[OUTSTR	[ASCIZ !EX!];SAY "HEX"
		 JRST H(X)]	;LEAVE
	CAIN	S,"D"		;DECIMAL?
	JRST	[OUTSTR	[ASCIZ !ECIMAL!]
		 JRST D(X)]
	CAIN	S,"O"
	JRST	[OUTSTR	[ASCIZ !CTAL!]
		 JRST O(X)]
	OUTSTR	[ASCIZ	!
? BAD BASE
!]
	JRST	ASK
GETCHR:	INCHRW	S		;GET A CHARACTER
	CAIGE	S,"A"+40	;LETTER?
	JRST	(PC)		;NO, RETURN
	CAIG	S,"Z"+40	;MAYBE...
	MOVEI	S,-40(S)	;YES, CONVERT TO UC
	JRST	(PC)		;RETURN
PAGE
SUBTTL DATA
	LIT			;GET THE LITERALS
HELP:	ASCIZ	!
INSTRUCTIONS:
  WHEN YOU SEE "FROM", TYPE O, D, OR H FOR OCTAL, DECIMAL,
OR HEX INPUT.  DO NOT FOLLOW WITH A CARRIAGE RETURN.  REPEAT
THIS PROCEDURE WHEN YOU SEE "TO" TO DETERMINE THE OUTPUT BASE.
  TO THE NUMBER SIGN (#) TYPE THE NUMBER IN YOUR SELECTED INPUT
BASE.  IN HEX MODE, LEGAL DIGITS ARE 0-9, A-F.  AFTER THE NUMBER
TYPE AN EQUAL SIGN (=) AND THE NUMBER WILL BE OUTPUT IN YOUR
REQUESTED OUTPUT BASE.  NUMBERS MAY NOT BE GREATER
THAN DECIMAL 2↑35-1, NOR LESS THAN 0.
!
IFG PURE,<RELOC 0>		;GO TO LO-SEG IF NOT ALREADY THERE
	VAR			;GET VARIABLES IF ANY
PDL:	BLOCK	↑D14		;PUSHDOWN STACK

	END	HOD		;THAT'S IT . . .